//
//  ZJView.m
//  DrawDemo
//
//  Created by ZJ on 2018/8/3.
//  Copyright © 2018年 iCatch Technology Inc. All rights reserved.
//

#import "ZJAdvanceView.h"

@implementation ZJAdvanceView


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    [self test6];
}

// 裁剪上下文显示的区域
- (void)test6 {
    // 获取图形对象
    UIImage *image = [UIImage imageNamed:@"me"];
    
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 绘制需要裁剪的形状
//    CGContextAddRect(ctx, CGRectMake(0, 0, 150, 150));
//    CGContextAddRect(ctx, CGRectMake(150, 150, 150, 150));
    CGContextAddArc(ctx, 150, 150, 150, 0, M_PI * 2, 1);
    
    // 裁剪
    // 注：告诉系统 以这个图形来裁剪图片 渲染 然后显示出来
    // 所谓裁剪并不是裁剪掉上下文 只是单纯的 裁剪出来希望显示的区域而已！！！
    CGContextClip(ctx);
    
    // 绘制图形到上下文中
    [image drawInRect:self.bounds];
}

// 绘制图片
- (void)test5 {
    // 绘制大图
    UIImage *image = [UIImage imageNamed:@"bg"];
    
    // 从某一个点开始绘制
//    [image drawAtPoint:CGPointMake(50, 50)];
    // 绘制到某一个区域(拉伸)
//    [image drawInRect:self.bounds];
    // 平铺到某一个区域（平铺）
    [image drawAsPatternInRect:self.bounds];
    
    // 绘制小图
//    UIImage *image = [UIImage imageNamed:@"me"];
    
    // 从某一个点开始绘制
//    [image drawAtPoint:CGPointMake(50, 50)];
    // 绘制到某一个区域(拉伸)
//    [image drawInRect:self.bounds];
    // 平铺到某一个区域（平铺）
//    [image drawAsPatternInRect:self.bounds];
}

// 绘制文字
- (void)test4 {
    NSString *str = @"哈哈啊哈哈";
    
    // 创建 shadow
    NSShadow *s = [[NSShadow alloc] init];
    // 阴影的偏移量
    s.shadowOffset = CGSizeMake(10, 10);
    // 模糊程度 越小越不模糊
    s.shadowBlurRadius = 0;
    // 阴影的颜色
    s.shadowColor = [UIColor lightGrayColor];
    
    // 文本属性
    NSDictionary *dict  = @{
                            NSFontAttributeName: [UIFont systemFontOfSize:30],
                            NSForegroundColorAttributeName: [UIColor orangeColor],
                            NSShadowAttributeName: s,
                            };
    
    // 绘制
    // 方法一：从某一点开始绘制
    [str drawAtPoint:CGPointMake(100, 100) withAttributes:dict];
    // 方法二：绘制到指定的区域
//    [str drawInRect:CGRectMake(0, 0, 200, 200) withAttributes:dict];
}

// quartz2d 内存管理
- (void)test3 {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 50, 50);
    CGPathAddLineToPoint(path, NULL, 250, 250);
    
    CGContextAddPath(ctx, path);
    
    CGContextStrokePath(ctx);
    
    // 释放
//    CGPathRelease(path);
    CFRelease(path);
}

// 图形上下文栈（先备份的state后恢复出来）
- (void)test2 {
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 备份
    CGContextSaveGState(ctx);
    
    // 拼接路径 把路径添加到上下文中
    CGContextAddArc(ctx, 150, 150, 100, 0, M_PI * 2, 1);
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, 300, 300);
    
    CGContextSetLineWidth(ctx, 10);
    
    // 第二次备份
    CGContextSaveGState(ctx);
    
    // 设置渲染颜色
    [[UIColor redColor] set];
    
    // 渲染
    CGContextStrokePath(ctx);
    
    // 拼接新的路径
    CGContextMoveToPoint(ctx, 20, 20);
    CGContextAddLineToPoint(ctx, 250, 20);
    
    // 第一次恢复
    CGContextRestoreGState(ctx);
    // 第二次恢复
    CGContextRestoreGState(ctx);
    
    // 渲染
    CGContextStrokePath(ctx);
}

// 矩阵操作（旋转缩放平移）
- (void)test1 {
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 矩阵操作
    // 旋转
//    CGContextRotateCTM(ctx, M_PI_4);
    // 缩放
//    CGContextScaleCTM(ctx, 1, 0.5);
    // 平移
    CGContextTranslateCTM(ctx, 150, 150);
    
    // 拼接路径
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, 150, 150, 100, 0, 2 * M_PI, 1);
    CGPathMoveToPoint(path, NULL, 0, 0);
    CGPathAddLineToPoint(path, NULL, 300, 300);
    
    // 添加路径到上下文
    CGContextAddPath(ctx, path);
    
    // 设置线宽
    CGContextSetLineWidth(ctx, 10);
    
    // 渲染
    CGContextStrokePath(ctx);
}

@end
